"""
@name : 内存管理
@author : wenyao
@projectname: xsfh
"""

#python内存管理

#python中每个对象都会维护一个ob_ref的字段，用来计数该对象当前被引用的次数
#当有新的引用指向该对象的时候，它的引用计数ob_ref就加1
#当该对象的引用失效时，引用计数就减1

#一旦对象的引用计数为0，该对象就被回收了，所占用的内存空间将被释放

#引用计数
#getrefcount是获取对象的引用计数，会创建一个临时的引用，因此得到的值会比期望多1
# >>> from sys import getrefcount
# >>> a = 1000
# >>> getrefcount(a)
# 2
# >>> b = a
# >>> getrefcount(a)
# 3
# >>> c.append(a)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# NameError: name 'c' is not defined
# >>> c= []
# >>> c.append(a)
# >>> getrefcount(a)
# 4
# >>> a = 300
# >>> getrefcount(a)
# 2
# >>> getrefcount(a)
# 2
# >>> getrefcount(b)
# 3
# >>> del b
# >>> b
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# NameError: name 'b' is not defined
# >>> getrefcount(c[0])
# 2
# >>> c[0]
# 1000

#内存泄露：某部分内存分配出去之后，无法回收，无法释放
#内存溢出： oom （out of memory），用的太多，给的太少

#循环引用
# >>> x = [1]
# >>> y = [2]
# >>> x.append(y)
# >>> x
# [1, [2]]
# >>> y.append(x)
# >>> getrefcount(x)
# 4
# >>> x
# [1, [2, [...]]]
# >>> getrefcount(x)
# 4
# >>> getrefcount(y)
# 3
# >>> y
# [2, [1, [...]]]
# >>> getrefcount(y)
# 4
# >>> getrefcount(x)
# 3
# >>> getrefcount(y)
# 3
# >>> del x
# >>> del y
# >>> x
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# NameError: name 'x' is not defined
# >>> y
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# NameError: name 'y' is not defined

#为了解决循环引用问题
#垃圾回收  -- 分代回收 和 标记清除

#python的内存管理
#引用计数为主，分代回收和标记清除为辅的方式进行内存回收
#内存池
#[-5,256]小整型数据 放在缓存区里
#字符串驻留区

